﻿#pragma once

#include <breaking/base/no_copy_able.h>
#include <breaking/base/define.h>

#include <thread>
#include <atomic>
#include <mutex>
#include <condition_variable>

namespace breaking
{
	/**
	 * @brief 线程类
	 */
	class thread : private no_copy_able
	{
	public:
		thread();
		virtual ~thread();

	protected:

		/**
		 * @brief 线程执行体，由派生类实现
		 */
		virtual void run() = 0;

	public:
		/**
		 *@brief 激活这个线程
		 */
		bool activate();

		/**
		 *@brief 终止线程并回收资源
		 */
		virtual void stop();

		/**
		 *@brief 回收线程资源
		 */
		void join();

		/**
		 * @brief 线程等待(ms)
		 * @param msecs
		 */
		static void sleep(uint32_t msecs);

		/**
		* @brief 检查是否请求停止线程
		* @note 如果run函数中有while循环，可以调用这个函数判断是否需要退出循环
		*/
		bool is_stop_requested() const;

		/**
		 * @brief 获取当前线程号
		 * @return
		 */
		int32_t get_id() const;

	private:
		/**
		 * @brief 根据不同系统获取线程ID
		 * @return
		 */
		int32_t _sys_thread_id() const;

	protected:
		// 线程ID
		int32_t						m_id;
		// 原子变量，标记线程是否正在运行
		std::atomic<bool>			m_running;
		// 线程对象，存储实际的线程
		std::thread					m_thread_obj;
		// 互斥锁，用于同步线程安全
		std::mutex					m_mtx;
		// 标记是否请求停止线程
		bool						m_stop_requested;
	};
}